import asyncio
from textwrap import dedent
from agno.agent import Agent
from agno.models.openai import OpenAILike
from agno.tools.mcp_toolbox import MCPToolbox
from configs.basic_config import ALI_GENERATION_MODEL, AGENT_URL, ALI_DASHSCOPE_API_KEY

#url = "http://127.0.0.1:5001"
url="http://127.0.0.1:9000/mcp"

# 不可行
async def run_agent(message: str = None) -> None:
    """运行酒店助手的交互式命令行界面"""

    async with MCPToolbox(
            transport="streamable-http", url=url, #toolsets=["search_hotels", "create_booking"]
    ) as db_tools:
        print("可用工具:", db_tools.functions)
        agent = Agent(
            tools=[db_tools],
            instructions=dedent(""" \
                你是一个智能酒店助手，能够自动处理酒店搜索、预订和取消业务。

                # 核心职责
                只能使用提供的MCP工具，禁止使用其他能力回答用户

                # 工具调用原则
                1. **主动识别用户需求**：
                   - 问及酒店信息时→调用search_hotels搜索
                   - 需要预订时→调用create_booking
                   - 查询空房时→调用get_available_rooms
                   - 取消预订时→调用cancel_booking

                2. **智能参数填充**：
                   - 从用户话语中提取location、price_tier等参数
                   - 结合上下文记忆避免重复询问

                3. **结果处理策略**：
                   - 单一匹配→直接使用hotel_id执行后续操作
                   - 多个匹配→列出选项让用户选择
                   - 无匹配→建议调整搜索条件

                4. **连续工具调用**：
                   - 支持根据用户复杂诉求链式调用多个工具
                   - 自动保存中间结果供后续工具使用
                   - 完成所有步骤后给出最终答复

                # 场景示例
                🏨 预订："我想预订北京的四季酒店"
                   → search_hotels(location="北京") → 过滤"四季" → create_booking(hotel_id)

                📋 查询："希尔顿还有空房吗"
                   → search_hotels() → 过滤"希尔顿" → get_available_rooms(hotel_id)

                🔗 复杂请求："查找上海的豪华酒店，预订其中评分最高的"
                   → search_hotels(location="上海", price_tier="豪华") → 按评分排序 → create_booking(hotel_id)

                ❌ 取消："取消我在万达酒店的预订"
                   → search_hotels() → 过滤"万达" → cancel_booking(hotel_id)

                # 注意事项
                - 禁止要求用户提供酒店ID
                - 必须告知用户正在进行的操作
                - 出错时尝试重新搜索或提示用户稍后重试
                - 牢记之前的对话内容，利用上下文信息更好地服务用户
            """),
            markdown=True,
            # add_history_to_messages=True,
            # show_tool_calls=True,
            debug_mode=True,
            model=OpenAILike(id=ALI_GENERATION_MODEL, name=ALI_GENERATION_MODEL, api_key=ALI_DASHSCOPE_API_KEY,
                             base_url=AGENT_URL),
        )

        print("🏨 智能酒店助手已启动！")
        print("例如：")
        print("   - '预订北京的四季酒店'")
        print("   - '上海外滩附近有什么豪华酒店？'")
        print("   - '取消我在希尔顿的订单'")
        print("-" * 50)

        await agent.acli_app(message=message, stream=True)


if __name__ == "__main__":
    asyncio.run(run_agent(message=None))